Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.

...powered by www.netzwerkartist.de...

 <<   zurück
Visual Basic 2005 von Andreas Kühnel
Das umfassende Handbuch
Buch: Visual Basic 2005

Visual Basic 2005
1.233 S., mit 2 CDs, 59,90 Euro
Galileo Computing
ISBN 3-89842-585-1
gp Kapitel 4 Das Klassendesign (Teil 1)
  gp 4.1 Einführung in die Objektorientierung
    gp 4.1.1 Das objektorientierte Paradigma
    gp 4.1.2 Vorteile der objektorientierten Programmierung
    gp 4.1.3 Zusammenfassung
  gp 4.2 Die Klassendefinition
    gp 4.2.1 Die Deklaration von Objektvariablen
    gp 4.2.2 Zugriffsmodifizierer einer Klasse
    gp 4.2.3 Der Projekttyp »Klassenbibliothek«
    gp 4.2.4 Splitten einer Klassendefinition mit »Partial«
    gp 4.2.5 Zusammenfassung
  gp 4.3 Objektmethoden
    gp 4.3.1 Methoden mit Rückgabewert
    gp 4.3.2 Methoden ohne Rückgabewert
    gp 4.3.3 Der Aufruf einer Methode
    gp 4.3.4 Methoden mit Parameterliste
    gp 4.3.5 Rückgabewert einer Methode
    gp 4.3.6 Variablen in einer Methode
    gp 4.3.7 Zugriffsmodifizierer einer Methode
    gp 4.3.8 Referenz- und Wertparameter
    gp 4.3.9 Parameter, die Objektreferenzen erwarten
    gp 4.3.10 Methodenüberladung
    gp 4.3.11 Optionale Parameter
    gp 4.3.12 Zusammenfassung
  gp 4.4 Objekteigenschaften
    gp 4.4.1 Ergänzung der Klasse »Circle«
    gp 4.4.2 Lese- und schreibgeschützte Eigenschaften
    gp 4.4.3 Die Parameterliste einer Property-Prozedur
    gp 4.4.4 Standardeigenschaften
    gp 4.4.5 Das With ... End With-Statement
    gp 4.4.6 Konstanten mit »Const« und »ReadOnly«
    gp 4.4.7 Der Zugriff auf private Daten
    gp 4.4.8 Zusammenfassung
  gp 4.5 Konstruktoren
    gp 4.5.1 Die Konstruktoren in der Klasse »Circle«
    gp 4.5.2 Die Konstruktoraufrufe
    gp 4.5.3 Definition von Konstruktoren
    gp 4.5.4 »Friend«-Konstruktoren
    gp 4.5.5 »Private«-Konstruktoren
    gp 4.5.6 Konstruktorverkettung
    gp 4.5.7 Zusammenfassung
  gp 4.6 Der Destruktor
    gp 4.6.1 Das Zerstören von Objekten
    gp 4.6.2 Der Garbage Collector
    gp 4.6.3 Zusammenfassung
  gp 4.7 Arbeiten mit Objektreferenzen
    gp 4.7.1 Prüfen auf Initialisierung
    gp 4.7.2 Mehrere Referenzen auf ein Objekt
    gp 4.7.3 Typfeststellung einer Objektreferenz
    gp 4.7.4 Zusammenfassung


Galileo Computing

4.4 Objekteigenschaften  downtop

Das wesentlichste Element eines Objekts sind seine Eigenschaften. Eigenschaften beschreiben den Zustand eines Objekts, sind also das individuelle Charakteristikum, um ein Objekt von einem anderen Objekt desselben Typs zu unterscheiden.

Betrachten wir zunächst den einfachsten Fall der Eigenschaftsimplementierung am Beispiel der weiter oben beschriebenen Klasse Circle. Ein Kreis wird bekanntlich zumindest durch seinen Radius beschrieben. Außerdem sollte die Lage des Kreismittelpunktes bekannt sein, um ein Kreisobjekt positionieren zu können. Daher werden in der Klassendefinition neben dem Radius zwei weitere Variablen festgelegt, die sowohl die x- als auch die y-Koordinaten beschreiben.


Public Class Circle
Public XKoordinate As Integer
Public YKoordinate As Integer
Public Radius As Double
End Class

Eine auf ein Objekt der Klasse Circle zugreifende Methode kann die Eigenschaften direkt manipulieren bzw. die Inhalte auswerten, da diese Public deklariert sind, z.  B.:


Dim meinKreis As Circle = New Circle()
meinKreis.Radius = 12

Zu den Schlüsselkonzepten der objektorientierten Programmierung zählt die Datenkapselung: Demnach sollten Objektdaten immer vor dem direkten Zugriff durch einen Aufrufer geschützt werden. Die Implementierung der Eigenschaften Radius, XKoordinate und YKoordinate entspricht nicht diesem Paradigma.

Denkt man des Weiteren über den Sinn einer Eigenschaft nach, wird man sehr schnell zu der Erkenntnis gelangen, dass in einer Klasse öffentlich deklarierte Variablen nicht mehr darstellen als die Platzhalter bestimmter Typen. Von einer Objekteigenschaft wird aber deutlich mehr erwartet. Was würden Sie erwarten, wenn in der Klasse Circle noch eine Eigenschaft Farbe definiert wäre, beispielsweise


Public Class Circle
Public Farbe As Long
...
End Class

und Sie einem konkreten Objekt mit


Dim meinKreis As Circle
meinKreis = New Circle()
meinKreis.Farbe = Rot

den Farbwert Rot mitteilen? Selbstverständlich würden Sie davon ausgehen, dass das Circle-Objekt auch in dieser Farbe dargestellt wird. Aber die Fähigkeit, den Kreis rot zu zeichnen und nicht blau, lila oder schwarz, hat die öffentlich deklarierte Variable nicht.

Auch die Übergabe an Radius ist nicht unproblematisch. Was ist, wenn der Aufrufer dem Radius eine negative Zahl übergibt? Sicherlich wird ein pfiffiger Mathematiker oder Physiker einen akademischen Erklärungsversuch starten wollen, an dem wir uns aber hier sicherlich nicht beteiligen wollen. Also was ist zu tun, um die Bedingung


CircleObjekt.Radius >=  0

zu erfüllen? Denkansätze zur Lösung gibt es mehrere:

1. Datentypänderung der Eigenschaft »Radius«: Eine erste Idee könnte es sein, einen Datentypen zu wählen, der nur den positiven Zahlenbereich abdeckt.
       
2. Eingabeüberprüfung beim Aufrufer: Die Eingabe könnte vor der Zuweisung mit einer If-Anweisung auf die gestellte Bedingung hin geprüft werden. Dieser Lösungsansatz führt sicher zum Ziel – und ist dennoch objektiv betrachtet nicht akzeptabel. Stellen Sie sich vor, Sie würden grundsätzlich immer nach dem Prinzip programmieren, vor der Zuweisung an eine Objekteigenschaft gegebenenfalls mit einer If-Anweisung den zu übergebenden Wert in der aufrufenden Methode auf seine Gültigkeit hin zu überprüfen. Stellen Sie sich weiter vor, Sie würden eine größere Anwendung entwickeln, in der die Circle-Klasse intensiv genutzt wird. Gesetzt den Fall, Sie haben den logischen Fehler der negativen Wertzuweisung an die Eigenschaft Radius nicht rechtzeitig erkannt, müsste später im gesamten Programmcode nach allen Zuweisungen an dieses Feld gesucht werden. Bleibt nur eine unentdeckt, kommt es zur Laufzeit der Anwendung zu falschen Ergebnissen. Damit steht fest: Dieser Lösungsansatz scheidet aufgrund seiner Fehlerträchtigkeit aus.
       
3. Eingabeüberprüfung im Klassencode: Nach der Argumentation in den vorhergehenden beiden Punkten verbleibt nur noch eine Alternative, die auch den einzig sinnvollen Weg darstellt: die Prüfung der korrekten Eingabe im Klassencode selbst.
       

Weil wir in den Ausführungen oben festgestellt haben, dass die Definition eines öffentlichen Feldes nicht akzeptabel ist, muss dazu eine Methode herangezogen werden. VB 2005 bietet zu diesem Zweck Eigenschaftsmethoden, auch kurz als Eigenschaften bezeichnet, an. Sehen wir uns dazu zunächst die Syntax an:


[Modifizierer] Property Name([Parameterliste]) [As Datentyp]
Get
' Anweisungen
[Exit Property]
Return <Rückgabewert>
End Get
Set(ByVal Value [As Datentyp])
' Anweisungen
[Exit Property]
End Set
End Property

Die Angabe des Typs der Eigenschaft ist nur dann zwingend erforderlich, wenn Option Strict auf On festgelegt ist.

Widmen wir uns zunächst den Zugriffsmodifizierern.


Tabelle 4.3     Zugriffsmodifizierer von Eigenschaftsmethoden

Modifizierer Beschreibung
Public (Standard) Der Zugriff auf die Eigenschaft unterliegt keinen Beschränkungen. Der Aufruf kann auch aus einer anderen Assembly heraus erfolgen.
Friend Auf eine Friend-Eigenschaft kann nur von einem Aufrufer zugegriffen werden, der sich innerhalb der Anwendung befindet, in der die Klasse definiert ist.
Private Der Zugriff ist nur aus der Klasse möglich, in der die Eigenschaft implementiert ist.
Dim Hat dieselbe Bedeutung wie Private.

Die Angabe eines Zugriffsmodifizierers ist optional. Wird darauf verzichtet, gilt die Eigenschaftsmethode als Public.

Eigenschaftsmethoden koordinieren den schreibenden und lesenden Zugriff auf ein Feld. Der Datentyp der Eigenschaft, den die Eigenschaftsmethode verkörpert, wird am Ende mit As <Datentyp> angegeben. Seltener wird bei einer Eigenschaftsmethode eine Parameterliste von Interesse sein. Sie dient dazu, um den Zugriff auf eine Eigenschaft in Abhängigkeit von Randbedingungen zu steuern. Wir werden das Thema am Ende dieses Abschnitts aufgreifen.

Da auf eine Eigenschaft sowohl lesend als auch schreibend zugegriffen werden kann, enthalten Eigenschaftsmethoden ein internes Prozedurpaar: Get/End Get und Set/End Set. Wird einer Eigenschaft ein Wert zugewiesen, wird der Set-Accessor aufgerufen, soll eine Eigenschaft ausgewertet werden, kommt es zum Aufruf von Get. Falls es sich als notwendig erweisen sollte, kann der Programmablauf zu jedem Zeitpunkt mit Exit Property die Eigenschaft außerplanmäßig verlassen.

Der Wert, den eine Eigenschaft repräsentiert, muss im Objekt gespeichert werden. Die Deklaration einer lokalen Variablen kommt nicht in Frage, weil nach dem Verlassen der Eigenschaftsmethode der Inhalt wieder verloren gehen würde. Um diese Schwierigkeit zu meistern, wird der dem Set-Accessor übergebene Wert in einem Private deklarierten Feld, also auf Klassenebene gespeichert.


Public Class Circle
Private dblRadius As Single
Public Property Radius() As Single
...
End Property
End Class

Dieser Lösungsansatz bietet zwei entscheidende Vorteile:

1. Die private Deklaration kapselt das Feld und verhindert einen unzulässigen, direkt lesenden beziehungsweise schreibenden Zugriff.
       
2. Innerhalb des Set-Blocks können Anweisungen programmiert werden, die den zu übergebenden Wert auf seine Zulässigkeit hin überprüfen und/oder den Wert dazu benutzen, Merkmale des Objekts entsprechend einzustellen. Wird beispielsweise die Füllfarbe eines Circle-Objekts durch die Zuweisung eines neuen Farbwertes an die Farbe-Eigenschaft gesetzt, soll die neue Farbe schließlich auch visualisiert werden – unter der Annahme natürlich, der Kreis wird in einer grafischen Oberfläche dargestellt. Get wiederum könnte sich dazu anbieten, die Berechtigung eines Aufrufers zum Lesen einer Eigenschaft sicherzustellen.
       

Schauen wir uns nun im Detail an, wie einer Eigenschaft ein Wert zugewiesen wird. Mit


meinKreis.Radius = 10

wird in der Eigenschaftsmethode der Set-Accsessor aufgerufen und der Wert im Parameter Value des Set-Zweigs übergeben. Im einfachsten Fall wird der Inhalt des Parameters dem Feld dblRadius direkt zugewiesen, das nun Private deklariert ist. Nur Code, der sich innerhalb der Klassendefinition befindet, hat Zugriff auf diese Variable, während der Zugriff von außen nicht möglich ist.


Public Class Circle
Private sngRadius As Single
...
Public Property Radius() As Single
...
Set(ByVal Value As Single)
sngRadius = Value
End Set
End Property
End Class

Die Rückgabe des Eigenschaftswertes, beispielsweise mit


Dim rad As Double = meinKreis.Radius

erfolgt durch Aufruf von Get, dessen Code im einfachsten Fall wie folgt lautet:


Get
Return sngRadius
End Get


Galileo Computing

4.4.1 Ergänzung der Klasse »Circle«  downtop

Fassen wir nun alle Überlegungen in Form von Änderungen in der Klasse Circle zusammen. Dabei soll die Übergabe eines unzulässigen Werts an die Eigenschaft Radius verhindert und der Anwender an der Konsole darüber informiert werden.


' -----------------------------------------------------------
' Beispiel: ...\Kapitel 4\CircleApplication_2
' -----------------------------------------------------------
Public Class Circle
Private intXKoordinate As Integer
Private intYKoordinate As Integer
Private dblRadius As Double
' ---------Eigenschaftsmethoden --------
Public Property Radius() As Double
Get
Return dblRadius
End Get
Set(ByVal Value As Double)
If Value >= 0 Then
dblRadius = Value
Else
Console.WriteLine("Unzulässiger Wert.")
End If
End Set
End Property
Public Property XKoordinate() As Integer
Get
Return intXKoordinate
End Get
Set(ByVal Value As Integer)
intXKoordinate = Value
End Set
End Property
Public Property YKoordinate() As Integer
Get
Return intYKoordinate
End Get
Set(ByVal Value As Integer)
intYKoordinate = Value
End Set
End Property
...
End Class

Die drei Eigenschaften der Circle-Klasse XKoordinate, YKoordinate und Radius werden nun allesamt durch Eigenschaftsmethoden beschrieben. Da sie Public deklariert sind, können sie von außerhalb der Klasse aufgerufen werden. Die Bezeichner der ursprünglich gleichnamigen Felder sind geändert worden, um innerhalb der Klasse die namentliche Eindeutigkeit zu gewährleisten.

Da die Mittelspunktskoordinaten keinen besonderen Anforderungen unterliegen, ist es im vorliegenden Fall vollkommen ausreichend, ohne eine Implementierung des zu übergebenden Wertes direkt an das Feld weiterzureichen bzw. dieses auszuwerten.

Der Ersatz der öffentlichen Felder durch eine Kombination von privaten Feldern und öffentlichen Eigenschaftsmethoden kann sich zu einem späteren Zeitpunkt als großer Vorteil herausstellen. Wenn sich die Implementierung des Programmcodes innerhalb der Eigenschaftsmethode als fehlerhaft erweist oder möglicherweise geändert werden muss, wird der aufrufende Code die Änderung nicht bemerken. Er erkennt nur den für ihn sichtbaren, öffentlichen Teil der Schnittstelle, bestehend aus Bezeichner, Parameterliste und Datentyp. Die Implementierungsänderung bleibt ihm verborgen.


Galileo Computing

4.4.2 Lese- und schreibgeschützte Eigenschaften  downtop

Es kommt häufig vor, dass eine Eigenschaft entweder schreib- oder lesegeschützt implementiert werden muss. Die Realisierung ist denkbar einfach. Einer schreibgeschützten Eigenschaft wird in der Definition das Schlüsselwort ReadOnly hinzugefügt. Eine so definierte Eigenschaft kann nur über Get aufgerufen werden. Daher ist die Unterprozedur Set zum Setzen einer Instanzvariablen wertlos und darf auch nicht im Prozedurkörper codiert werden.


...
Private myVar as Integer
Public ReadOnly Property MyProp() As Integer
Get
Return myVar
End Get
End Property

Eine mit ReadOnly gekennzeichnete, schreibgeschützte Eigenschaft macht natürlich keinen Sinn, wenn es keinen anderen Weg geben würde, ihr einen Wert zuzuweisen. Dieser Weg führt in der Regel über den Aufruf einer anderen Methode der Klasse, die ihrerseits den Wert nach einem vorgegebenen Algorithmus setzt. Oftmals werden gekapselte Felder von schreibgeschützten Eigenschaften auch bei der Initialisierung des Objekts in einem parametrisierten Konstruktor festgelegt.

Soll eine Objekteigenschaft zur Laufzeit einer Anwendung lesegeschützt sein, wird in der Definition der Eigenschaft das Schlüsselwort WriteOnly angegeben. Eine lesegeschützte Eigenschaft darf nur den Set-Accessor enthalten.


Public WriteOnly Property MyProp() As Integer
Set(ByVal Value As Integer)
myVar = Value
End Set
End Property

Da die Rückgabe einer lesegeschützten Eigenschaft vorgesehen ist, bleibt der Inhalt des privaten Feldes dem Aufrufer verborgen. Die Eingabe eines Passwortes, das dazu benutzt wird, benutzerabhängige Zugriffe auf das Objekt methodenabhängig zu steuern, ist dafür ein typisches Beispiel.

Der Wert einer lesegeschützten Eigenschaft kann selbstverständlich durch eine andere Instanzmethode zurückgegeben werden.

Sichtbarkeit der Accessoren »Get« und »Set«

Wird keine andere Angabe gemacht, entspricht die Sichtbarkeit der beiden Accessoren Get und Set per Vorgabe der Sichtbarkeit der Eigenschaftsmethode. Ist die Eigenschaftsmethode beispielsweise Public, sind Get und Set automatisch ebenfalls ohne Einschränkung sichtbar. Mit einem neuen Feature wartet VB 2005 auf: Die Accessoren dürfen eine individuelle Sichtbarkeit aufweisen. Damit lässt sich der Zugriff auf die beiden Accessoren feiner steuern.


Public Property TestProperty() As Integer
Set(ByVal value As Integer)
someValue = value
End Set
Friend Get
Return someValue
End Get
End Property

In diesem Codefragment ist die Eigenschaft TestProperty öffentlich definiert. Der Set-Accessor hat keinen abweichenden Zugriffsmodifizierer, folglich kann aus jeder anderen Anwendung heraus der Wert gesetzt werden. Im Gegensatz dazu schränkt der Zugriffsmodifizierer Friend das Auswerten der Eigenschaft auf die aktuelle Anwendung ein. Code, der sich nicht in der gleichen Anwendung befindet, kann den Inhalt des Feldes someValue nicht auswerten.

Der Einsatz der Zugriffsmodifizierer auf die beiden Accessoren unterliegt Regeln, die Sie sich merken sollten:

gp  In der Eigenschaftsmethode müssen beide Accessoren definiert sein.
gp  Nur bei einem der beiden Accessoren darf ein vom Zugriffsmodifizierer der Eigenschaftsmethode abweichender Zugriffsmodifizierer angegeben werden.
gp  Der Zugriffsmodifizierer des Accessors muss einschränkender sein als der der Eigenschaftsmethode. Angenommen die Eigenschaftsmethode ist Public definiert, so können die Modifizierer Friend, Protected und Private benutzt werden. Public wäre in diesem Fall sogar unzulässig.

Galileo Computing

4.4.3 Die Parameterliste einer Property-Prozedur  downtop

Stellen Sie sich vor, Sie hätten die Klasse Car mit der Eigenschaft Farbe als Komponente einer größeren Anwendung definiert, die von einem Autohändler einer bestimmten Marke eingesetzt wird. Wie Ihnen sicherlich bekannt ist, hängt die angebotene Außenfarbe eines Wagens oft von der Ausstattung eines Typs ab. Bestellen Sie die Version GTI, können Sie möglicherweise nur aus der ansonsten reichhaltigeren Farbpalette Schwarz oder Rot wählen, bei der Version SDI darüber hinaus noch Gelb und Silbermetallic.

Wie aber kann diese Abhängigkeit einer Klassendefinition mitgeteilt werden? Müssen Sie für jede Ausstattungsvariante eine neue Klasse implementieren, oder bieten sich andere Möglichkeiten an?

Es gibt andere Möglichkeiten. Sie können die Parameterliste der Eigenschaftsmethode dazu benutzen, die Farbwahl abhängig vom gewählten Typ zu überprüfen. Dazu wird bei der Zuweisung der Farbe an das Car-Objekt als Argument der Typ angegeben.


mycar.Farbe("GTI") = Rot

Es sei davon ausgegangen, dass den Farben Integer-Konstanten zugeordnet sind. Die zu diesem Aufruf zugehörige Definition der Property-Prozedur würde in diesem speziellen Fall wie folgt lauten:


Public Class Car
'gekapselte Instanzvariable
Private autoFarbe As Int32
Public Property Farbe(ByVal type As String) As Integer
...
Set(ByVal Value As Integer)
Select Case type
Case "GTI"
Select Case Value
Case 1, 2
autoFarbe = Value
Case Else
Console.WriteLine("Unzulässige Farbe")
End Select
Case "SDI"
Select Case Value
Case 1, 2, 3, 5, 8, 9
autoFarbe = Value
Case Else
Console.WriteLine("Unzulässige Farbe")
End Select
End Select
End Set
End Property
End Class

Sie können die Parameterliste auch dazu benutzen, mehrere Zustandswerte mit einem Aufruf dem Objekt mitzuteilen. Bezogen auf das Beispiel wäre es demnach möglich, neben dem Farbwert auch in einem Aufruf die Ausstattungsvariante des gewählten Typs festzulegen.

Ein kleiner Hinweis ist an dieser Stelle angebracht. Der Zusammenhang zwischen der Ausstattungsvariante und den angebotenen Farben ist offensichtlich. Sollten Sie auf eine ähnliche Problematik stoßen, wäre es überlegenswert, die Abhängigkeiten durch eine Datenbank abzubilden. Da das Beispiel nur als eine Demonstration des Einsatzes der Parameterliste dient, haben wir auf eine genaue Analyse zur Findung der besten Lösung verzichtet.

Sie werden wahrscheinlich nur sehr selten eine Eigenschaft mit einer Parameterliste definieren müssen. Sinnvoll ist eine Parameterliste meist nur dann, wenn beim Setzen einer Instanzvariablen Randbedingungen von Interesse sind, die einen Einfluss auf den endgültigen Inhalt des Feldes haben.


Galileo Computing

4.4.4 Standardeigenschaften  downtop

Eine Standardeigenschaft kann auf eine Objektreferenz aufgerufen werden, ohne die Eigenschaft ausdrücklich anzugeben. Voraussetzung ist, dass in der Parameterliste der Eigenschaftsmethode zumindest ein nichtoptionaler Parameter angegeben ist. Das alleine ist allerdings noch nicht ausreichend, zusätzlich muss der Methodensignatur mit Default noch ein weiterer Modifizierer hinzugefügt werden.

Betrachten Sie das folgende Codefragment einer Standardeigenschaft, die diese beiden Bedingungen erfüllt:


Public Class MyOwnClass
Private intVar As Integer
Default Public Property MyProp(ByVal x As Long) As Integer
Get
Return intVar
End Get
Set(ByVal Value As Integer)
intVar = Value
End Set
End Property
End Class

Die Eigenschaft MyProp kann nun auf zweierlei Weise aufgerufen werden. Zunächst einmal bietet sich der herkömmliche Weg über die explizite Angabe des Eigenschaftsnamens an, also:


Dim obj As New MyOwnClass()
obj.MyProp(15) = 2

Wegen der Inanspruchnahme der Standardeigenschaft wäre die kürzere, aber sicherlich auch schlechter lesbare und daher auch weniger empfehlenswerte Variante:


Dim obj As New MyOwnClass()
obj(15) = 2

Was auffällt, ist die syntaktische Ähnlichkeit mit der Zuweisung an ein Array-Element, was durchaus zu Verwechslungen führen kann. Interessant wird es aber insbesondere dann, wenn tatsächlich ein Objekt-Array dieses Typs deklariert und der Standardeigenschaft eines Elements dieses Arrays ein Wert zugewiesen wird.


Sub Main()
Dim obj(3) As MyOwnClass
obj(1) = New MyOwnClass()
obj(1)(2) = 9
Console.WriteLine(obj(1)(2))
Console.Read()
End Sub

Zunächst wird das dynamische Objektfeld obj mit vier Elementen deklariert. Jedes Element eines Objekt-Arrays muss einzeln initialisiert werden – im Beispiel oben ist es das zweite Element mit dem Index 1, dessen Standardeigenschaft in der darauf folgenden Codezeile ohne explizite Angabe des Feldnamens MyProp ein Wert zugewiesen wird.


obj(1)(2) = 9

Es lässt sich kaum darüber streiten, ob die Zuweisung in die Kategorie gute Lesbarkeit fällt oder nicht. Welcher der beiden Klammerwerte repräsentiert den Array-Index des Elements, welcher ist das der Parameterliste übergebene Argument? Besser wäre es, die Eigenschaft explizit zu nennen:


obj(1).MyProp(2) = 9

Sie sollten sich daher sehr genau überlegen, ob Sie eine Eigenschaft zu einer Standardeigenschaft erklären.


Galileo Computing

4.4.5 Das With ... End With-Statement  downtop

Sie werden sehr oft in die Situation kommen, auf die Eigenschaften oder Methoden eines Objekts mehrfach hintereinander zugreifen zu müssen. Es kann dabei recht mühevoll werden, immer wieder den Bezeichner neu eingeben zu müssen.

Visual Basic bietet mit dem With ... End With-Statement eine recht attraktive Möglichkeit, sowohl die Tipparbeit zu verkürzen als auch den Programmcode übersichtlicher zu gestalten. Die Syntax hierzu lautet:


With <Objektbezeichner>
[Statement 1]
[Statement 2]
...
[Statement 3]
End With

Schauen wir uns den Einsatz an einem kleinen Beispiel an, bei dem wir wieder die Existenz einer Klasse Car annehmen:


Dim meinAuto As New Car()
With meinAuto
.Farbe = 10
.Hersteller = "Audi"
Console.WriteLine("Kaufpreis = {0}", .Kaufpreis)
.Fahren()
End With

Es werden mehrere Statements auf ein Objekt ausgeführt, ohne die qualifizierende Referenz anzugeben. Die Punktnotation wird vor dem Punkt aufgebrochen, der nun vor der Angabe einer Elementfunktion geschrieben werden muss, um die Zugehörigkeit der Elementfunktion kenntlich zu machen. Dabei spielt es keine Rolle, ob es sich bei der Elementfunktion um eine Eigenschaft oder Methode handelt.

With ... End With-Statements können auch verschachtelt werden. Dieser Fall setzt eine zumindest zweifach auftretende Punktnotation voraus, die dann auftritt, wenn eine Objekteigenschaft ihrerseits selbst wieder durch ein anderes Objekt beschrieben wird.


With Form1
.Height = 1000
.Width = 2500
With .Font
'entspricht Form1.Font.Italic = False
.Italic = False
.Bold = True
End With
End With

Eine diametrale Verschachtelung ist nicht zulässig.

Das With ... End With-Statement unterliegt einer Einschränkung: Es darf nur auf Objekte angewandt werden.


Galileo Computing

4.4.6 Konstanten mit »Const« und »ReadOnly«  downtop

Sie könnten die öffentliche Variable einer Klasse mit ReadOnly schreibgeschützt implementieren:


Public ReadOnly MyConst As Integer = 12

Ein zweite Alternative bietet das Schlüsselwort Const.


Public Const MyConst As Integer = 12

Was im ersten Moment identisch aussieht, birgt dennoch einen kleinen Unterschied. Der Wert einer als Const definierten Konstanten kann zu keinem Zeitpunkt der Laufzeit verändert werden.

Etwas weniger restriktiv verhalten sich ReadOnly-Konstanten, denn deren Wert kann tatsächlich noch geändert werden. Allerdings beschränkt sich der Zeitpunkt der möglichen Änderung auf die Ausführung eines Konstruktors, der bei jeder Objektinstanziierung aufgerufen wird (Konstruktoren behandeln wir weiter unter in diesem Kapitel).


Public Sub New()
MyConst = 34
End Sub

Wenn das Objekt vollständig erstellt ist, ist eine Änderung der ReadOnly-Konstanten nicht mehr erlaubt.


Galileo Computing

4.4.7 Der Zugriff auf private Daten  downtop

Eine Objektmethode kann nicht auf die privaten Daten eines anderen Objekts zugreifen. Dies war bisher immer die Aussage, die allerdings nicht uneingeschränkt gültig ist, wie das folgende Beispiel der Klasse TestClass zeigen soll.


Class TestClass
Private intVar As Integer
Public Sub InternProc(ByVal obj As TestClass)
Console.Write("intVar des Objekts = {0}", obj.intVar)
End Sub
Public Property MyValue() As Integer
Get
Return intVar
End Get
Set(ByVal value As Integer)
intVar = value
End Set
End Property
End Class

In der Klassendefinition ist das Feld intVar Private deklariert, um den unbefugten, direkten Zugriff von außen zu unterbinden. Dieses Feld kann infolgedessen nur durch eine Eigenschaft manipuliert werden, in unserem Beispiel MyValue.

Mit etwas Besonderem wartet die Methode InternProc auf. Sie empfängt beim Aufruf im Parameter obj die Referenz auf ein anderes Objekt vom Typ TestClass. Es mag überraschend klingen, aber diese Referenz soll dazu benutzt werden, um auf die private Instanzvariable intVar des übergebenen Objekts zuzugreifen. Nach allen bisherigen Aussagen dürfte dieser Zugriff eigentlich nicht erlaubt sein.

Im folgenden Codefragment wollen wir die Klasse TestClass testen. Dazu werden zwei konkrete Objekte vom Typ TestClass erzeugt und der Eigenschaft MyValue des ersteren ein Wert zugewiesen.


Dim obj1 As New TestClass
Dim obj2 As New TestClass
obj1.MyValue = 4711

Im nächsten Schritt folgt der Aufruf der InternProc-Methode des Objekts obj2 unter Übergabe der Referenz auf das Objekt obj1.


obj2.InternProc(obj1)

Tatsächlich wird an der Konsole der Inhalt der gekapselten, privaten Instanzvariablen angezeigt:


intVar des Objekts = 4711

Die Kapselung der Variablen wird also aufgebrochen, die Variable ist auswertbar. Dieser Effekt scheint im Widerspruch zu dem zu stehen, was Sie bisher über die Kapselung gehört haben, und bildet die einzige Ausnahme, die der folgende Satz beschreibt:


Aus einem Objekt heraus kann auf private Instanzvariablen eines anderen Objekts zugegriffen werden, wenn beide Objekte vom gleichen Typ sind.



Galileo Computing

4.4.8 Zusammenfassung  toptop

gp  Zustandsdaten eines Objekts werden in Feldern vorgehalten. Ist ein Feld Public deklariert, gehört es zur öffentlichen Schnittstelle eines Objekts und kann ohne Einschränkungen von außen manipuliert werden.
gp  Ein Private deklariertes Feld kapselt den von ihm beschriebenen Wert. Der Wert kann nur von Code, der sich innerhalb der Klasse befindet, manipuliert werden.
gp  Standardmäßig enthält eine Eigenschaftsmethode die beiden Accessoren Get und Set, die jeweils einen eigenen Anweisungsblock beschreiben. Der Get-Block wird ausgeführt, wenn ein externer Aufrufer ein bestimmtes Feld auswerten möchte, der Set-Block wird bei der Zuweisung an ein Feld aufgerufen.
gp  Fehlt in einer Eigenschaft der Set-Accessor, handelt es sich um eine schreibgeschützte Eigenschaft, fehlt der Get-Accessor, ist die Eigenschaft lesegeschützt. Eine schreibgeschützte Methode wird um den Modifizierer ReadOnly ergänzt, eine lesegeschützte um WriteOnly.
gp  Einer der beiden Accessoren kann eine von der Eigenschaftsmethode abweichende Sichtbarkeit haben. Dazu wird dem Accessor ein Zugriffsmodifizierer vorangestellt, der einschränkender sein muss als der der Eigenschaftsmethode.
gp  Konstanten werden im Deklarationsabschnitt einer Klasse festgelegt. Sie ähneln einer Felddefinition, ergänzt um das Schlüsselwort Const und den von ihnen repräsentierten Wert.
gp  Eine Konstante kann auch mit dem Schlüsselwort ReadOnly definiert werden. Die Zuweisung an ein ReadOnly-Feld muss nicht in der Deklarationsanweisung stehen, sondern kann auch in einem Konstruktor erfolgen.
gp  Aus einem Objekt heraus kann auf private Instanzvariablen eines anderen Objekts zugegriffen werden – vorausgesetzt, beide Objekte sind vom gleichen Typ.
 <<   zurück
  
  Zum Katalog
Zum Katalog: Visual Basic 2005
Visual Basic 2005
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Visual C# 2005






 Visual C# 2005


Zum Katalog: Fortgeschrittene Programmierung mit Visual C# 2005






 Fortgeschrittene
 Programmierung
 mit Visual C# 2005


Zum Katalog: Das Programmierhandbuch SQL Server 2005






 Das Programmier-
 handbuch
 SQL Server 2005


Zum Katalog: Einstieg in Visual Basic 2005






 Einstieg in
 Visual Basic 2005


Zum Katalog: Einstieg in Visual C# 2005






 Einstieg in
 Visual C# 2005


Zum Katalog: Konzepte und Lösungen für Microsoft-Netzwerke






 Konzepte und
 Lösungen für
 Microsoft-Netzwerke


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo








Copyright © Galileo Press 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de